#include <iostream>
#include <unistd.h>

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int count = 1000;
void *ticket(void *args)
{
    // 预定演唱会门票
    std::string name = static_cast<char *>(args);
    while (count > 0)
    {
        pthread_mutex_lock(&mutex);
        if (count > 0)
        {
            std::cout << name << " 售出门票 : " << count << std::endl;

            count--;
        }
        pthread_mutex_unlock(&mutex);
        usleep(100);
    }
    return (void *)100;
}

int main()
{
    pthread_t t1, t2, t3, t4;
    pthread_create(&t1, nullptr, ticket, (void *)"pthread-1 ");
    pthread_create(&t2, nullptr, ticket, (void *)"pthread-2 ");
    pthread_create(&t3, nullptr, ticket, (void *)"pthread-3 ");
    pthread_create(&t4, nullptr, ticket, (void *)"pthread-4 ");

    pthread_join(t1, nullptr);
    pthread_join(t2, nullptr);
    pthread_join(t3, nullptr);
    pthread_join(t4, nullptr);
    return 0;
}

// #include <iostream>
// #include <unistd.h>
// // #include <pthread.h>
// #include "mutex.hpp"

// mymutex::mutex _mutex;
// int count = 1000;

// void *task(void *args)
// {
//     std::string name = static_cast<char *>(args);
//     // 对count--,出票
//     while (count > 0)
//     {
//         // pthread_mutex_lock(&mutex);
//         // std::cout << name << ", count = " << count << std::endl;
//         // count--;
//         // pthread_mutex_unlock(&mutex);
//         // usleep(100);

//         /*加锁，线程没有拿到锁就会阻塞在这里;*/
//         _mutex.Lock();
//         // 拿到锁之后要进行判断
//         if (count > 0)
//         {
//             std::cout << name << ", count = " << count << std::endl;
//             count--;
//             _mutex.Unlock();
//         }
//         else
//         {
//             // 如果count<=0,不能进行--(售票)
//             // 释放锁
//             _mutex.Unlock();
//             std::cout << name << ", 出票失败" << std::endl;
//         }
//         usleep(100);
//     }
//     return args;
// }

// int main()
// {
//     pthread_t t1, t2, t3, t4;
//     pthread_create(&t1, nullptr, task, (void *)"thread-1");
//     pthread_create(&t2, nullptr, task, (void *)"thread-2");
//     pthread_create(&t3, nullptr, task, (void *)"thread-3");
//     pthread_create(&t4, nullptr, task, (void *)"thread-4");

//     pthread_join(t1, nullptr);
//     pthread_join(t2, nullptr);
//     pthread_join(t3, nullptr);
//     pthread_join(t4, nullptr);

//     return 0;
// }

// // struct thread_mutex
// // {
// //     thread_mutex(std::string name, pthread_mutex_t &mutex) : _name(name), _mutex(mutex)
// //     {
// //     }

// //     std::string _name;
// //     pthread_mutex_t &_mutex;
// // };

// // int count = 1000;
// // void *task(void *args)
// // {
// //     thread_mutex *td_mx = static_cast<thread_mutex *>(args);
// //     while (count > 0)
// //     {
// //         //
// //         pthread_mutex_lock(&td_mx->_mutex);
// //         if (count > 0)
// //         {
// //             std::cout << td_mx->_name << ", count = " << count << std::endl;
// //             count--;
// //             pthread_mutex_unlock(&td_mx->_mutex);
// //             usleep(1000);
// //         }
// //         else
// //         {
// //             pthread_mutex_unlock(&td_mx->_mutex);
// //             usleep(1000);
// //         }
// //     }
// //     return args;
// // }

// // int main()
// // {
// //     // 定义局部锁，初始化
// //     pthread_mutex_t _mutex;
// //     pthread_mutex_init(&_mutex, nullptr);

// //     pthread_t t1, t2, t3, t4;
// //     thread_mutex tm1("thread-1", _mutex);
// //     thread_mutex tm2("thread-2", _mutex);
// //     thread_mutex tm3("thread-3", _mutex);
// //     thread_mutex tm4("thread-4", _mutex);
// //     pthread_create(&t1, nullptr, task, (void *)&tm1);
// //     pthread_create(&t2, nullptr, task, (void *)&tm2);
// //     pthread_create(&t3, nullptr, task, (void *)&tm3);
// //     pthread_create(&t4, nullptr, task, (void *)&tm4);

// //     pthread_join(t1, nullptr);
// //     pthread_join(t2, nullptr);
// //     pthread_join(t3, nullptr);
// //     pthread_join(t4, nullptr);
// //     return 0;
// // }

// // // 加锁
// // pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

// // int count = 1000;
// // void *task(void *args)
// // {
// //     std::string name = static_cast<char *>(args);
// //     // 对count--,出票
// //     while (count > 0)
// //     {
// //         // pthread_mutex_lock(&mutex);
// //         // std::cout << name << ", count = " << count << std::endl;
// //         // count--;
// //         // pthread_mutex_unlock(&mutex);
// //         // usleep(100);

// //         /*加锁，线程没有拿到锁就会阻塞在这里;*/
// //         pthread_mutex_lock(&mutex);
// //         // 拿到锁之后要进行判断
// //         if (count > 0)
// //         {
// //             std::cout << name << ", count = " << count << std::endl;
// //             count--;
// //             pthread_mutex_unlock(&mutex);
// //         }
// //         else
// //         {
// //             // 如果count<=0,不能进行--(售票)
// //             // 释放锁
// //             pthread_mutex_unlock(&mutex);
// //             std::cout << name << ", 出票失败" << std::endl;
// //         }
// //         usleep(100);
// //     }
// //     return args;
// // }

// // int main()
// // {
// //     pthread_t t1, t2, t3, t4;
// //     pthread_create(&t1, nullptr, task, (void *)"thread-1");
// //     pthread_create(&t2, nullptr, task, (void *)"thread-2");
// //     pthread_create(&t3, nullptr, task, (void *)"thread-3");
// //     pthread_create(&t4, nullptr, task, (void *)"thread-4");

// //     pthread_join(t1, nullptr);
// //     pthread_join(t2, nullptr);
// //     pthread_join(t3, nullptr);
// //     pthread_join(t4, nullptr);

// //     return 0;
// // }